//package com.hitqz.robot.dispatch.netty.service.impl;
//
//import cn.hutool.extra.spring.SpringUtil;
//import com.google.common.cache.Cache;
//import com.hitqz.robot.api.business.dto.RobotClientSummaryDto;
//import com.hitqz.robot.api.business.entity.RobotEntity;
//import com.hitqz.robot.api.dispatch.model.RobotDispatchDto;
//import com.hitqz.robot.dispatch.netty.strategy.AlgorithmStrategy;
//import com.hitqz.robot.dispatch.netty.util.JtsUtil;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.locationtech.jts.geom.GeometryFactory;
//import org.locationtech.jts.geom.Polygon;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//
///**
// * @author xupkun
// * @date 2024/9/5
// */
//@Service("timelyCalculateStrategy")
//@RequiredArgsConstructor
//@Slf4j
//public class TimelyCalculateStrategyServiceImpl implements AlgorithmStrategy {
//    private final double EPSILON = 1e-9;;
//
//    private static final GeometryFactory geometryFactory = new GeometryFactory();
//
//    @Override
//    public void calculate(List<RobotEntity> robotEntityList) {
//        Cache<String, RobotClientSummaryDto> posInfoDtoCache = SpringUtil.getBean("robotCache");
//        Cache<String, RobotDispatchDto> dispatchDtoCache = SpringUtil.getBean("cacheRobotTask");
//        List<RobotEntity> pauseRobotList = new ArrayList<RobotEntity>();
//        List<RobotEntity> resumeRobotList = new ArrayList<RobotEntity>();
//        for (int i = 0; i < robotEntityList.size(); i++) {
//            RobotEntity currentRobot = robotEntityList.get(i);
//            for (RobotEntity nextRobot : robotEntityList.subList(i + 1, robotEntityList.size())) {
//                if (!currentRobot.getMapCode().equals(nextRobot.getMapCode())) {
//                    log.info("two robots are in different maps: {}---{},-- {}--{}", currentRobot.getRobotSn(),
//                            nextRobot.getMapCode(), currentRobot.getRobotSn(), nextRobot.getRobotSn());
//                    continue;
//                }
//                RobotClientSummaryDto currentRobotSummary = getRobotSummary(posInfoDtoCache, currentRobot.getRobotSn());
//                RobotClientSummaryDto nextRobotSummary = getRobotSummary(posInfoDtoCache, nextRobot.getRobotSn());
//
//                RobotDispatchDto currentDispatchDto = dispatchDtoCache.getIfPresent(currentRobot.getRobotSn());
//                RobotDispatchDto nextDispatchDto = dispatchDtoCache.getIfPresent(nextRobot.getRobotSn());
//
//                // 如果有一台是静止的，那么默认为机器人不会发生问题
//                double firstSpeed = parseSpeed(currentRobotSummary.getStatus().getSpeed());
//                double nextSpeed = parseSpeed(nextRobotSummary.getStatus().getSpeed());
//
//                if (Math.abs(firstSpeed - 0.0) < EPSILON && Math.abs(nextSpeed - 0.0) < EPSILON) {
//                    // 执行相应的逻辑
//                    //log.info("some robot has 0 speed and is ignored: {}={}; {}:{}",
//                    //        currentRobot.getRobotSn(), firstSpeed, nextRobot.getRobotSn(), nextSpeed);
//                    continue;
//                }
//                // 静止的车的话 位置锁定
//                Polygon firstPolygon = JtsUtil.getRectangleVertices(currentRobotSummary.getPosition().getLaserPos().getX(), currentRobotSummary.getPosition().getLaserPos().getY(),
//                        nextRobotSummary.getOtherInfo().getRobotLength().doubleValue(), nextRobotSummary.getOtherInfo().getRobotWidth().doubleValue());
//                Polygon nextPolygon = JtsUtil.getRectangleVertices(nextRobotSummary.getPosition().getLaserPos().getX(), nextRobotSummary.getPosition().getLaserPos().getY(),
//                        nextRobotSummary.getOtherInfo().getRobotLength().doubleValue(), nextRobotSummary.getOtherInfo().getRobotWidth().doubleValue());
//
//                // 计算是否目标点相同
//                if (currentDispatchDto != null) {
//
//                }
//
//                if (nextDispatchDto != null) {
//
//                }
//
//                if (firstPolygon.intersects(nextPolygon) && nextPolygon.overlaps(firstPolygon)){
//                    // 两车即将相交
//
//                }
//
//                // 计算重复路径,下标
//
//
//                // 计算路径长度
//
//
//                // 计算时间差
//
//
//            }
//        }
//    }
//
//    private static RobotClientSummaryDto getRobotSummary(Cache<String, RobotClientSummaryDto> cache, String robotSn) {
//        return cache.getIfPresent(robotSn);
//    }
//
//    private static double parseSpeed(String speedStr) {
//        try {
//            return Double.parseDouble(speedStr);
//        } catch (NumberFormatException e) {
//            log.error("Failed to parse speed: " + speedStr, e);
//            return 0.0;
//        }
//    }
//
//
//    /**
//     * 查找两个列表中重复的 RobotEntity 元素。
//     * @param list1 第一个 RobotEntity 列表
//     * @param list2 第二个 RobotEntity 列表
//     * @return 包含重复 RobotEntity 的列表
//     */
//    public List<RobotEntity> findDuplicates(List<RobotEntity> list1, List<RobotEntity> list2) {
//        Set<String> uniqueIds = new HashSet<>();
//        Set<RobotEntity> duplicates = new HashSet<>();
//        // 遍历第一个列表，记录每个元素的 robotSn
//        list1.forEach(t-> {
//            uniqueIds.add(t.getRobotSn());
//        });
//
//        // 遍历第二个列表，检查 robotSn 是否存在于第一个列表中
//        list2.forEach(t-> {
//            if (uniqueIds.contains(t.getRobotSn())) {
//                duplicates.add(t);
//            }
//        });
//        return new ArrayList<>(duplicates);
//    }
//}
